package org.example.maven.utils.excel;

import com.alibaba.excel.EasyExcel;

import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;


import java.util.List;

public class ExcelExportUtil {
    public static <T> void export(HttpServletResponse response, List<T> data, Class<T> clazz, String fileName) throws IOException, IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题，请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        // 使用RFC 5987规范编码
        String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8)
                .replace("+", "%20");  // 空格特殊处理
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        // 双保险设置响应头
        response.setHeader("Content-Disposition",
                "attachment; filename=\"" + fallbackName(fileName) + "\"; " +
                        "filename*=utf-8''" + encodedFileName + ".xlsx");

        EasyExcel.write(response.getOutputStream(), clazz).sheet("sheet1").doWrite(data);
    }
    // 生成兼容ASCII的回退文件名
    private static String fallbackName(String fileName) {
        return fileName.replaceAll("[^\\x20-\\x7e]", "_");
    }

}
